Writing vertex and fragment shaders

ShaderLab着色器包括的不仅仅是“硬件着色器”。他们做许多事情。它们描述了在材质检验员中显示的属性,包含不同图形硬件的多个着色器实现,配置固定函数硬件状态等等.。实际上可编程着色器--就像顶点和片段程序,只是整体的一部分ShaderLab的“着色”的概念。看看着色器教程的基本介绍。在这里,我们将调用低层次的硬件着色器着色器程序。

If you want to write shaders that interact with lighting, take a look at Surface Shaders documentation. For some examples, take a look at Vertex and Fragment Shader Examples. The rest of this page will assume shaders that do not interact with Unity lights (e.g. special effects, Image Effects etc.) 如果你想写灯光交互的着色器,查看Surface Shaders文档。对于一些例子,看看顶点和片段着色器的例子。本页面的其余部分将承担着色不与Unity灯光交互(如特殊效果,图像效果等)

着色程序是用CG / HLSL语言,通过嵌入“片段”在渲染文本,里面通过命令。他们通常看起来像这样:

  Pass {
      // ... the usual pass state setup ...

      CGPROGRAM
      // compilation directives for this snippet, e.g.:
      #pragma vertex vert
      #pragma fragment frag

      // the Cg/HLSL code itself

      ENDCG
      // ... the rest of pass setup ...
  }

Cg/HLSL 片段

CG / HLSL程序片段被写入在CGPROGRAM和ENDCG之间。

在这段汇编指令的开始可以作为#编译指示语句。指示哪个着色器函数编译的指令:

#pragma vertex name - 编译函数名称为顶点着色.

#pragma fragment name - 编译函数名为片段材质.

#pragma geometry name - 编译函数名作为DX10几何着色器。这个选项会自动打开#pragma target 4.0,描述如下。

#pragma hull name - 编译函数名为DX11外壳着色器。这个选项会自动打开#pragma target 5.0,描述如下。

#pragma domain name - 编译函数名为DX11域着色器。这个选项会自动打开#pragma target 5.0,描述如下。

其他编译指令:

#pragma target name - 它的目标编译为。查看着色编译目标页面的细节。

#pragma only_renderers 空间分隔的名称-编译着色器只给渲染。默认的着色器编译所有的渲染器。详情见下面的渲染器。

#pragma exclude_renderers 空间分隔的名字不编译了渲染着色器。默认的着色器编译所有的渲染器。详情见下面的渲染器。

#pragma multi_compile … - 用于工作与多个着色变种。

#pragma enable_d3d11_debug_symbols - 生成编译为DirectX 11着色器调试信息,这将允许你调试着色器通过Visual Studio 2012(或更高)的图形调试器。

#pragma hardware_tier_variants 渲染器的名称生成多个着色器的硬件版本的每个编译着色器,每个硬件层,可以选择渲染器。详情见下面的渲染器。

每个代码段必须包含至少一个顶点程序和一个片段程序。因此# pragma顶点和片段# pragma指令要求。

汇编指令,不要做任何从Unity5,可以安全地删除: #pragma glsl, #pragma glsl_no_auto_normalization, #pragma profileoption, #pragma fragmentoption.

Rendering platforms

Unity支持一些渲染API(如OpenGL和Direct3D 9),默认情况下所有的着色器程序被编译成支持所有渲染器。你可以渲染编译使用#语用only_renderers或exclude_renderers # pragma指令。在您明确地使用一些在某些平台上不可能使用的着色器语言特性的情况下,这是非常有用的。支持的渲染器是:

d3d9 - Direct3D 9
d3d11 - Direct3D 11/12
glcore - OpenGL 3.x/4.x
gles - OpenGL ES 2.0
gles3 - OpenGL ES 3.x
metal - iOS/Mac Metal
d3d11_9x - Direct3D 11 9.x feature level, as commonly used on WSA platforms
xboxone - Xbox One
ps4 - PlayStation 4
psp2 - PlayStation Vita
n3ds - Nintendo 3DS
wiiu - Nintendo Wii U

例如,该行只会在编译着色器D3D9模式:

    #pragma only_renderers d3d9

🔚